package final$finally$finalize区别.finally关键字;

import java.util.concurrent.TimeUnit;

public class FinallyDemo {

    public static void main(String arg[]) {
        System.out.println(getNumber(0));
        System.out.println(getNumber(1));
        System.out.println(getNumber(2));
        System.out.println(getNumber(4));
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("执行 run()方法");
                try {
                    System.out.println("执行 try 语句块");
                    TimeUnit.SECONDS.sleep(5); //阻塞5s
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    //该行代码不会执行
                    /**
                     * 守护线程的特性是：只要JVM中没有任何非守护线程在运行，
                     * 那么虚拟机会kill掉所有守护线程从而终止程序。
                     * 换句话说，就是守护线程是否正在运行，都不影响JVM的终止。
                     * 典型的就是垃圾回收线程
                     */
                    System.out.println("执行 finally 语句块");
                }
            }
        });
        thread.setDaemon(true);
        thread.start();
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static int getNumber(int num) {
        try {
            int result = 2 / num;
            return result;
        } catch (Exception exception) {
            // System.exit(0);
            /**
             *  该方法用来结束当前正在运行的Java JVM。如果 status 是非零参数，那么表示是非正常退出。
             *  System.exit(0) ：将整个虚拟机里的内容都关掉，内存都释放掉！正常退出程序。
             *  System.exit(1) ：非正常退出程序
             *  System.exit(-1) ：非正常退出程序
             *  由于当前JVM已经结束了，因此程序代码自然不能继续执行
             */
            return 0;
        } finally {
            if (num == 0) {
                return -1;
            }
            if (num == 1) {
                return 1;
            }
        }
    }

}
